cmake_minimum_required(VERSION 3.16)
project(DangerousRacers VERSION 0.2.0 LANGUAGES CXX)

#if (MSVC AND NOT CMAKE_GENERATOR MATCHES "Visual Studio")
#    message(STATUS "Forcing Visual Studio generator")
#    set(CMAKE_GENERATOR "Visual Studio 17 2022" CACHE INTERNAL "" FORCE)
#endif()


# =========================
# C++ Standard
# =========================
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# =========================
# Build Type Default
# =========================
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif()

message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")

# =========================
# MSVC Runtime (IMPORTANT)
# Use dynamic runtime (/MD, /MDd)
# Reduces antivirus false positives
# =========================
if (MSVC)
    set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
endif()

# =========================
# SFML Configuration
# =========================
include(FetchContent)

# Debug = static (easy local dev)
# Release = shared (better distribution)
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    set(BUILD_SHARED_LIBS OFF)
    set(SFML_STATIC_LIBRARIES ON)
else()
    set(BUILD_SHARED_LIBS ON)
    set(SFML_STATIC_LIBRARIES OFF)
endif()

FetchContent_Declare(
        SFML
        GIT_REPOSITORY https://github.com/SFML/SFML.git
        GIT_TAG 2.6.1
        GIT_SHALLOW ON
)

FetchContent_MakeAvailable(SFML)

# =========================
# Source Files
# =========================
set(SOURCE_FILES
        src/main.cpp
        src/Scene.cpp
        src/AnimatedSprite.cpp
        src/SceneManager.cpp
        src/DrawableEntity.cpp
        src/Meter.cpp
        src/Player.cpp
        src/Obstacles/Obstacle.cpp
        src/Obstacles/ObstacleManager.cpp
        src/Label.cpp
        src/Button.cpp
        src/Scenes/MainMenu.cpp
        src/Scenes/studio_splashscreen.cpp
        src/Scenes/TutorialOver.cpp
        src/Scenes/GameOver.cpp
        src/Scenes/Levels/tutorial_level.cpp
        src/Scenes/Levels/level_one.cpp
)

# =========================
# Executable
# =========================
# WIN32 removes console window (optional)
add_executable(DangerousRacers ${SOURCE_FILES})

# Only apply for Release builds on Windows
if(WIN32)
    target_link_options(DangerousRacers PRIVATE
            $<$<CONFIG:Release>:/SUBSYSTEM:WINDOWS>
            $<$<CONFIG:Release>:/ENTRY:mainCRTStartup>
    )
endif()

# =========================
# Detect Windows SDK tools (rc.exe)
# =========================
if (WIN32)
    find_program(WINSDK_RC NAMES rc)
endif()

if (WINSDK_RC)
    message(STATUS "Windows SDK detected � enabling version.rc")
    target_sources(DangerousRacers PRIVATE resources/version.rc)
else()
    message(WARNING "Windows SDK NOT found � skipping version.rc")
endif()


# =========================
# Includes
# =========================
target_include_directories(DangerousRacers PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/include
)

# =========================
# Compile Definitions
# =========================
if(SFML_STATIC_LIBRARIES)
    target_compile_definitions(DangerousRacers PRIVATE SFML_STATIC)
endif()

# =========================
# Linking
# =========================
target_link_libraries(DangerousRacers PRIVATE
        sfml-graphics
        sfml-window
        sfml-system
        sfml-audio
)

# =========================
# Compiler Flags
# =========================
if(MSVC)
    target_compile_options(DangerousRacers PRIVATE
            $<$<CONFIG:Release>:/O2 /DNDEBUG>
            $<$<CONFIG:Debug>:/Zi>
    )
endif()

# =========================
# Copy Assets
# =========================
add_custom_command(TARGET DangerousRacers POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_directory
        ${CMAKE_CURRENT_SOURCE_DIR}/assets
        $<TARGET_FILE_DIR:DangerousRacers>/assets
)

add_custom_command(TARGET DangerousRacers POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy
        ${CMAKE_CURRENT_SOURCE_DIR}/resources/README.md
        $<TARGET_FILE_DIR:DangerousRacers>/README.md
)

# =========================
# OpenAL DLL (needed for audio)
# =========================
if (WIN32)
    if (CMAKE_SIZEOF_VOID_P EQUAL 8)
        set(OPENAL_DLL "${sfml_SOURCE_DIR}/extlibs/bin/x64/openal32.dll")
    else()
        set(OPENAL_DLL "${sfml_SOURCE_DIR}/extlibs/bin/x86/openal32.dll")
    endif()

    add_custom_command(TARGET DangerousRacers POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy_if_different
            "${OPENAL_DLL}"
            $<TARGET_FILE_DIR:DangerousRacers>
    )
endif()

# =========================
# Copy SFML DLLs (Release builds)
# =========================
if(WIN32 AND BUILD_SHARED_LIBS)
    add_custom_command(TARGET DangerousRacers POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy_if_different
            $<TARGET_FILE:sfml-graphics>
            $<TARGET_FILE:sfml-window>
            $<TARGET_FILE:sfml-system>
            $<TARGET_FILE:sfml-audio>
            $<TARGET_FILE_DIR:DangerousRacers>
    )
endif()

# =========================
# Install / Packaging (optional)
# =========================
install(TARGETS DangerousRacers DESTINATION .)

install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/assets
        DESTINATION ./assets)

# =========================
# Output Directories
# =========================
set_target_properties(DangerousRacers PROPERTIES
        RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)